#include <iostream>
#include <vector>
#include <string>
#include <thread>
#include <sw/redis++/redis++.h>

using namespace std;
using namespace sw::redis;
using namespace std::chrono_literals;

void test1(Redis& redis)
{
    cout << "using get and set" << endl;
    redis.flushall();

    redis.set("key1", "111");
    auto ret = redis.get("key1");
    if(ret) cout << ret.value() << endl;

    redis.set("key1", "222");
    ret = redis.get("key1");
    if(ret) cout << ret.value() << endl;
}

void test2(Redis& redis)
{
    cout << "using set NX" << endl;
    redis.flushall();

    redis.set("key", "111");

    redis.set("key", "222", 0s, UpdateType::ALWAYS);
    
    auto ret = redis.get("key");
    if(ret) cout << ret.value() << endl;
}

void test3(Redis& redis)
{
    cout << "using mget and mset" << endl;
    redis.flushall();

    redis.mset({make_pair("key1", "111"), make_pair("key2", "222")});
    
    vector<OptionalString> rets;
    auto it = back_inserter(rets);
    redis.mget({"key1", "key2"}, it);

    for(auto& ret : rets)
        if(ret) cout << ret.value() << endl;
}

void test4(Redis& redis)
{
    cout << "using getrang and setrange" << endl;
    redis.flushall();

    redis.set("key", "abcdefghijk");

    string ret = redis.getrange("key", 2, 5);
    cout << ret << endl;

    long long num = redis.setrange("key", 2, "uio");
    auto result = redis.get("key");
    if(result) cout << result.value() << endl;
}

void test5(Redis& redis)
{
    cout << "using incr and decr" << endl;
    redis.flushall();

    redis.set("key", "100");

    auto ret = redis.incr("key");
    cout << ret << endl;

    ret = redis.decr("key");
    cout << ret << endl;
}

int main()
{
    Redis redis("tcp://127.0.0.1:6379");
    // test1(redis);
    // test2(redis);
    // test3(redis);
    // test4(redis);
    test5(redis);
    return 0;
}